/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Servlet;
import Service.GestioneDB;
import Service.Previsione;
import Service.Utente;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 *Questa classe permette di gestire la navigazione tra le diverse pagine JSP
*/


public class Operazioni extends HttpServlet {




    /* Reindirizzamneto ad un'altra pagina*/
    private void forward(HttpServletRequest request, HttpServletResponse response, String page) throws ServletException,IOException {
        /*Creo un oggetto servlet context che mi permette di interagire con la servlet*/
        ServletContext context = getServletContext();
        /* Il request dispatcher può essere utilizzato per aggiungere una risorsa alla ripsosta*/
        RequestDispatcher rd = context.getRequestDispatcher(page);
        rd.forward(request, response);
    }
    /*Process Request permette di gestire le richieste http*/
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*comportati come il doGet(); */
        doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        GestioneDB db = GestioneDB.getInstance();
        String azione = request.getParameter("op");
        //* Se non vi è l'ogetto session lo creo*/
        HttpSession session = request.getSession(true);
        Utente user = (Utente) session.getAttribute("utente");
        /*Gestione delle operazioni*/
        if (azione == null) {
            
            /*DEFAULT*/
            /* Come operazione di default se è stata selezionata alcuna operazione, viene visualizzata la home*/
             
            forward(request,response,"/Azioni?op=home");
            return;
            
        } else if (azione.equalsIgnoreCase("home")) {
            
            /*HOME*/
            /* Nella home mostriamo le diverse previsioni meteo delle città più grosse quali
             * Milano - Torino - Roma - Bologna - Venezia
             */
            Previsione[] prev = new Previsione[4];
            String c = request.getParameter("citta");
            if(c!=null){
                /* Controllo che la città esista nel database*/
                if(db.getIdCitta(c) == -1) 
                    session.setAttribute("err", "Non esiste la città inserita non vi sono previsioni che vi fanno riferimento");
            }else{ c="Roma"; }
            session.setAttribute("citta",c);
                /* controllo che esistano delle previoni per la città inserita*/
            if(db.previsioneCitta(c, 3) == null)
                session.setAttribute("err", "Non esiste la città inserita non vi sono previsioni che vi fanno riferimento");
            else {
                prev[0] = db.previsioneCitta(c,0);
                prev[1] = db.previsioneCitta(c,1);
                prev[2] = db.previsioneCitta(c,2);
                prev[3] = db.previsioneCitta(c,3);
                session.setAttribute("risultato", prev);
            }
            /*Rimando alla index tanto di default la pagina da visualizzare è home*/
            forward(request,response,"/index.jsp");
            return;
            
        } else if (azione.equalsIgnoreCase("login")) {
            
            /*LOGIN*/
            /* Controllo se sono stati settati i campi di login username e password*/
            
            String username = request.getParameter("username");
            String password = request.getParameter("password"); 
            if (username == null || password == null) {
                /* Se l'autentificazione non avviene con successo rimando l'utente 
                 * ad una pagina per la gestione degli errori
                 */
                session.setAttribute("error", "Errore inserimento dati nei campi username e password.");
                forward(request, response, "/errori.jsp");
                return;
            }           
            /* Se i campi sono settati correttmanete controllo che l'utente esista nel database*/
            Utente ut = db.login(username,password);           
            /*Se l'utente è presente nella base di dati allora eseguo il login*/
            /*Se l'utente non è stato trovato allora la variabile utente è null*/
            if (ut != null) {
                session.setAttribute("username", ut);
                forward(request, response, "/Azioni?op=home");
                return;
            } else {
                session.setAttribute("error", "Utente non trovato.");
                forward(request, response, "/errori.jsp");
                return;
            }
            
        } else if (azione.equalsIgnoreCase("previsioni")) {
            /*
            * Lista delle previsioni meteo di una citta 
            */   
            String localita = (String) request.getParameter("inputMeteo");      
          /* Controllo che il form di input della localito di cui cercare e previsioni
           * sia completato*/
            session.setAttribute("citta",localita);
            if (localita != null) {
                 if(db.getIdCitta(localita) == -1){ 
                    session.setAttribute("error", "Non esiste la città inserita o non vi sono previsioni che vi fanno riferimento");
                    forward(request,response,"/errori.jsp");
                 }
                Previsione[] prev = new Previsione[7];
                for(int i=0; i<7;i++)
                    if(db.previsioneCitta(localita,i)!=null)
                        prev[i] = db.previsioneCitta(localita,i);        
                session.setAttribute("previsioni",prev);
            }    
            forward(request,response,"/previsioni.jsp");
            return;
        } else if (azione.equalsIgnoreCase("cambioPassword")) {
                /* CAMBIA PASSWORD
                 * Operazione di cambio password di login per l'utente attuale
                 */
            String chiave = request.getParameter("password");
            String rechiave = request.getParameter("password2");
            
            /* Se non sono stati inseriti correttamente tutti e tre i campi allora visualizzo un messaggio di errore*/
            if (chiave == null || rechiave == null || !chiave.equals(rechiave)) {
                session.setAttribute("error", "Operazione di cambio password non terminata con successo.");
                forward(request, response, "/errori.jsp");
                return;
            }      
            Utente u = (Utente) session.getAttribute("username");
            if (db.cambiaPassword( u.getUsername() , chiave)) {
                session.setAttribute("info", "Password sostituita con successo.");
                forward(request, response, "/informazioni.jsp");
                return;
            } else {
                session.setAttribute("error", "Si è verificato un errore nell'inserimento della nuova password.");
                forward(request, response, "/errori.jsp");
                return;
            }
            
        } else if (azione.equalsIgnoreCase("registrazione")) {
            
            /*REGISTRAZIONE*/
            /*Creo un nuovo utente nel database*/
            
            String utente = request.getParameter("username");
            String chiave = request.getParameter("password");
            String rechiave = request.getParameter("password2");
            
            /* Se non sono stati inseriti correttamente tutti e tre i campi allora visualizzo un messaggio di errore*/
            if (utente == null || chiave == null || rechiave == null || !chiave.equals(rechiave)) {
                session.setAttribute("error", "Operazione di registrazione non terminata con successo.");
                forward(request, response, "/errori.jsp");
                return;
            }
            
            /* Controllo che l'utente non sia già presente nel db */
            if (db.esisteUtente(utente)) {
                session.setAttribute("error", "Nome utente già in uso.");
                forward(request, response, "/errori.jsp");
                return;
            }
            
            if (db.aggiungiUtente(utente, chiave)) {
                session.setAttribute("info", "Account creato con successo.");
                forward(request, response, "/informazioni.jsp");
                return;
            } else {
                session.setAttribute("error", "Si è verificato un errore nella creazione di un nuovo utente.");
                forward(request, response, "/errori.jsp");
                return;
            }
            
        } else if (azione.equalsIgnoreCase("logout")) {
            
            /* LOGOUT
            * Disconnessione dell'utente
            */
            session.invalidate();
            forward(request,response,"/Azioni?op=home");
            return;           
          
        } else {
            
            // OPERAZIONE NON CONOSCIUTA
            // Nel caso venga inserita un'operazione non conosciuta, rimando alla homepage
            // per prevenire comportamenti malevoli.
            
            forward(request,response,"/Azioni?op=home");
            return;
            
        }
        
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Servlet for web application.";
    }
}